
import java.util.Random;

/**
 *
 * @author Administrador
 */
public final class Generador {

    private Generador() {
    }
    /*
     * Genera numeros de distribucion normal con la formula de sumatoria
     * Por parametro recibe el numero de valores Uniformes para generar
     * un numero de distribucion normal
     */

    public static double normalSumatoria(int nValores) {
        double sumatoria = 0, num = 0;
        for (int i = 0; i < nValores; i++) {
            sumatoria += Math.random() - (nValores / 2);
        }
        return sumatoria / (Math.sqrt(nValores / 12));
    }
    /*
     * Genera numeros de distribucion normal con la formula de seno y coseno
     * R1 y R2 son generados aleatoriamente, NO se pasan por parametro
     */

    public static double normal(int m) {
        double r1 = 0, r2 = 0;
        r1 = Math.random();
        r2 = Math.random();
        if (Math.random() < (1 / 2)) {
            return Math.sqrt((-2) * Math.log(r1)) * Math.sin(2 * Math.PI * r2);
        } else {
            return Math.sqrt((-2) * Math.log(r1)) * Math.cos(2 * Math.PI * r2);
        }
    }
    /*
     * Genera numeros de distribucion Poisson
     * Recibe la media M(x) como parametro
     */

    public static double poisson(double media) {
        double a = Math.pow(Math.E, (-(1 / media))), b = 1, i = -1;
        do {
            i++;
            b *= Math.random();
        } while (b >= a);
        return i;
    }

    //REVISAR
    public static double exponencial(double media) {
        return Math.log(1 - Math.random()) / (-(1 / media));
    }

    public static double uniforme() {
        return Math.random();
    }

    public static double uniforme(double a, double b) {
        return (Math.random() * (b - a)) + a;
    }

    public static Random getRandom() {
        return new Random();
    }

    public static Random getRandomConSemilla(int semilla) {
        return new Random(semilla);
    }

    public static double getNumAleatorio() {
        return Math.random();
    }

    public static int congruenciaMixta(int a, int b, int m, int semilla) {
//        int a = 5;
//        int b = 4;
//        int m = 17;
        return (a * semilla + b) % m;
    }

    public static int congruenciaMultiplicativa(int a, int m, int semilla) {
//        int a = 5;
//        int m = 17;
        return (a * semilla) % m;
    }
}
